﻿#define _CRT_SECURE_NO_WARNINGS 1

//BC153[NOIP2010]数字统计  --- 牛客OJ

//#include <stdio.h>
//int numof2(int n)
//{
//    int cnt = 0;
//    while (n)
//    {
//        if (2 == n % 10)
//            cnt++;
//        n /= 10;
//    }
//    return cnt;
//}
//int main() {
//    int L = 0, R = 0;
//    scanf("%d %d", &L, &R);
//    int i = 0;
//    int ret = 0;
//    for (i = L; i <= R; i++)
//    {
//        ret = numof2(i);
//
//    }
//
//    printf("%d\n", ret);
//
//    return 0;
//}

//逗号表达式 -- 逗号表达式，从左向右依次执⾏。整个表达式的结果是最后⼀个表达式的结果。
//#include<stdio.h>
//
//int main()
//{
//	int a = 1;
//	int b = 2;
//	int c = (a > b, a = b + 10, a, b = a + 1);//逗号表达式
//			//0   ,a = 12     , a=12,b = 12+1 = 13
//	printf("c = %d\n", c);//13
//
//	return 0;
//}

//[] 下标引⽤操作符
//#include<stdio.h>
//
//int main()
//{
//	int arr[10];
//	arr[7] = 3;
//	//[]的操作数是:数组名arr,下标7
//
//	return 0;
//}

//函数调⽤操作符
//函数在调用的时候，函数名后边的括号就是函数调用操作符
//() 操作数是:函数名,参数
//函数调用操作符，最少有1个操作数 - 函数名
//#include<stdio.h>
//int add(int x, int y)
//{
//	return x + y;
//}
//void test()
//{
//	printf("测试!\n");
//}
//int main()
//{
//	int a = 3, b = 7;
//	int ret = add(a, b);
//
//	printf("ret = %d\n", ret);
//
//	test();
//
//	return 0;
//}


//结构体
//定义一个结构体描述一个学生，其中包括姓名、性别、年龄、学号
//#include<stdio.h>
//
//struct student
//{
//	//成员列表
//	char name[20];
//	char sex[5];
//	int age;
//	char id[12];
//}s3,s4,s5;//变量列表(结构体变量(全局))
//
////全局变量
//struct student s2;
//
//int main()
//{
//	//局部变量
//	struct student s1 = { "张三","男",33,"2010330201" };//初始化
//	struct student s7 = { .age = 17,.id = "2010330202",.name = "lisi",.sex = "女"};//指定顺序初始化
//
//	printf("%s %s %d %s\n", s1.name, s1.sex, s1.age, s1.id);//结构成员访问操作符 使⽤⽅式：结构体变量.成员名
//	printf("%s %s %d %s\n", s7.name, s7.sex, s7.age, s7.id);
//
//	return 0;
//}

//#include<stdio.h>
////坐标点结构体
//struct point
//{
//	int x;
//	int y;
//}p1;//声明类型的同时定义变量P1
//
//struct point p2;//定义结构体变量p2
//
//struct Node
//{
//	int data;
//	struct point p;//结构体嵌套
//	struct Node* next;
//}n1 = { 0,{4,3},NULL};//结构体嵌套初始化
//
//struct Node n2 = { 1,{7,3},NULL};//结构体嵌套初始化
//
//int main()
//{
//	struct point p3 = { 3, 7 };//定义变量并初始化
//
//	return 0;
//}

//整型提升
//char倒底是signed char?还是unsiged char？标准是没有规定的，取决于你使用的编译器
//在当前使用VS上，char就是signed char

//#include<stdio.h>
//
//int main()
//{
//	char a = 3;
//	//00000011
//	//00000000000000000000000000000011 - 整型提升
//
//	char b = -7;
//	//11111001
//	//11111111111111111111111111111001 - 整型提升
//
//	char c = a + b;
//	//11111111111111111111111111111100 - 补码
//	//10000000000000000000000000000011 - 反码
//	//10000000000000000000000000000100 - 原码
//
//	printf("c = %d\n", c);//?  -4  (%d - 按照整型有符号数打印)
//
//	return 0;
//}


//单身狗1
//在一个整型数组中，只有一个数字出现一次，其他数组都是成对出现的，请找出那个只出现一次的数字。
//例如：
//数组中有：1 2 3 4 5 1 2 3 4，只有5出现一次，其他数字都出现2次，找出5
#include<stdio.h>

////解法不好
//int main()
//{
//	int arr[9] = { 1,2,3,4,5,1,2,3,4 };
//	int size = sizeof(arr) / sizeof(int);
//
//	int i = 0;
//	for (i = 0; i < size; i++)
//	{
//		int cnt = 0;
//		int j = 0;
//		for (j = i + 1; j < size; j++)
//		{
//			if (arr[i] == arr[j])
//				cnt++;
//		}
//		if (0 == cnt)
//		{
//			printf("%d\n", arr[i]);
//			break;
//		}
//	}
//
//	return 0;
//}

// 异或 a ^ a = 0, a ^ 0 = a
int Find_single_dog(int arr[], int size)
{
	int ret = 0;
	int i = 0;
	for (i = 0; i < size; i++)
	{
		ret ^= arr[i];
	}
	return ret;
}

int main()
{
	int arr[] = { 1,2,3,4,5,1,2,3,4 };
	int size = sizeof(arr) / sizeof(int);

	int dog = Find_single_dog(arr, size);

	printf("dog = %d\n", dog);

	return 0;
}



